package com.chrray.position.util.tx;


import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


/**
 * @author LM
 * @date 2023/11/22 14:57
 */
public class OssFileUtil {


    /**
     * 创建存储桶
     *
     * @param bucket    存储桶名称，格式：BucketName-APPID
     * @param cannedAcl // 设置 bucket 的权限为 Private(私有读写)、其他可选有 PublicRead（公有读私有写）、PublicReadWrite（公有读写）
     * @return
     */
    public static Bucket createBucket(String secretId,String secretKey,String regionAdd,String bucket, CannedAccessControlList cannedAcl) throws Exception {

        COSClient cosClient = OssFileUtil.createCOSClient(secretId,secretKey,regionAdd);
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
// 设置 bucket 的权限为 Private(私有读写)、其他可选有 PublicRead（公有读私有写）、PublicReadWrite（公有读写）
        createBucketRequest.setCannedAcl(cannedAcl);
        try {
            Bucket bucketResult = cosClient.createBucket(createBucketRequest);
            return bucketResult;
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
            throw new Exception();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
            throw new Exception();
        }

    }

    /**
     *
     * @param secretId 用户的 SecretId，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
     * @param secretKey 用户的 SecretKey，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
     * @param regionAdd  ap-shanghai
     * @return
     */
    public static COSClient createCOSClient(String secretId,String secretKey,String regionAdd) {
        // 1 初始化用户身份信息（secretId, secretKey）。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
       COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionAdd);
        ClientConfig clientConfig = new ClientConfig(region);
// 这里建议设置使用 https 协议
// 从 5.6.54 版本开始，默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);
// 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

    /**
     * 查看存储桶列表
     *
     * @return
     */
    public static List<Bucket> listBucket(String secretId,String secretKey,String regionAdd) {

        COSClient cosClient = OssFileUtil.createCOSClient(secretId,secretKey,regionAdd);
        List<Bucket> buckets = cosClient.listBuckets();

        return buckets;

    }

    /**
     * 上传文件
     * @param localFilePath 指定要上传的文件
     * @param bucketName    指定文件将要存放的存储桶
     * @param key           指定文件上传到 COS 上的路径，即对象键。例如对象键为 folder/picture.jpg，则表示将文件 picture.jpg 上传到 folder 路径下
     * @return
     */
    public static PutObjectResult uploadFile(String secretId,String secretKey,String regionAdd,String localFilePath, String bucketName, String key) {

        // 指定要上传的文件
        File localFile = new File(localFilePath);

        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
        COSClient cosClient = OssFileUtil.createCOSClient(secretId,secretKey,regionAdd);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        return putObjectResult;

    }

    /**
     * 查询桶下面文件
     * @param bucketName  Bucket 的命名格式为 BucketName-APPID ，此处填写的存储桶名称必须为此格式
     * @param prefix // prefix 表示列出的 object 的 key 以 prefix 开始
     * @return
     */
    public static List<COSObjectSummary> uploadFile(String secretId,String secretKey,String regionAdd,String bucketName, String prefix) {


        ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
// 设置 bucket 名称
        listObjectsRequest.setBucketName(bucketName);
        listObjectsRequest.setPrefix(prefix);
// deliter 表示分隔符, 设置为/表示列出当前目录下的 object, 设置为空表示列出所有的 object
        listObjectsRequest.setDelimiter("/");
// 设置最大遍历出多少个对象, 一次 listobject 最大支持1000
        listObjectsRequest.setMaxKeys(1000);
        ObjectListing objectListing = null;
        COSClient cosClient = OssFileUtil.createCOSClient(secretId,secretKey,regionAdd);
        List<COSObjectSummary> result =new ArrayList<>();
        do {
            try {
                objectListing = cosClient.listObjects(listObjectsRequest);
            } catch (CosServiceException e) {
                e.printStackTrace();
                break;
            } catch (CosClientException e) {
                e.printStackTrace();
                break;
            }
            // common prefix 表示被 delimiter 截断的路径, 如 delimter 设置为/, common prefix 则表示所有子目录的路径
//            List<String> commonPrefixs = objectListing.getCommonPrefixes();


            // object summary 表示所有列出的 object 列表
            List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
            result.addAll(cosObjectSummaries);
            String nextMarker = objectListing.getNextMarker();
            listObjectsRequest.setMarker(nextMarker);
        } while (objectListing.isTruncated());
        return result;

    }
}
